home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d10 / rem23.arc / REMIND.DOC < prev    next >
Text File  |  1991-02-19  |  48KB  |  1,258 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.                                     REMIND 2.3 #0
  9.  
  10.                                    By David Skoll
  11.  
  12.                             (C) 1990, 1991 by David Skoll
  13.  
  14.                                   19 February 1991
  15.  
  16.  
  17.  
  18.                   To print this document, type: COPY REMIND.DOC PRN
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.                                   Table of Contents
  26.  
  27.  
  28.           1. INTRODUCTION  . . . . . . . . . . . . . . . . . . . . . . .   1
  29.  
  30.           2. THE FINE PRINT  . . . . . . . . . . . . . . . . . . . . . .   2
  31.  
  32.           3. USING REMIND  . . . . . . . . . . . . . . . . . . . . . . .   3
  33.                3.1. Running REMIND . . . . . . . . . . . . . . . . . . .   3
  34.                3.2. The REM Command  . . . . . . . . . . . . . . . . . .   4
  35.                     3.2.1. Date specifications . . . . . . . . . . . . .   5
  36.                     3.2.2. Backward Scanning . . . . . . . . . . . . . .   7
  37.                     3.2.3. Advance Warning . . . . . . . . . . . . . . .   7
  38.                     3.2.4. The MSG Keyword . . . . . . . . . . . . . . .   8
  39.                     3.2.5. The RUN Keyword . . . . . . . . . . . . . . .   8
  40.                     3.2.6. Getting Reminded only Once per Day  . . . . .   8
  41.                     3.2.7. Locally Omitting Weekdays . . . . . . . . . .   9
  42.                     3.2.8. Periodic Reminders  . . . . . . . . . . . . .   9
  43.                     3.2.9. The AT Keyword  . . . . . . . . . . . . . . .  10
  44.                     3.2.10. The BEFORE, SKIP and AFTER Keywords  . . . .  10
  45.                3.3. The OMIT Command . . . . . . . . . . . . . . . . . .  11
  46.                     3.3.1. The "+" and "-" Forms vs "++" and "--"  . . .  12
  47.                3.4. The UNTIL Keyword  . . . . . . . . . . . . . . . . .  12
  48.                3.5. The INCLUDE Command  . . . . . . . . . . . . . . . .  13
  49.                3.6. Substitution . . . . . . . . . . . . . . . . . . . .  13
  50.                3.7. Producing a Calendar . . . . . . . . . . . . . . . .  17
  51.                3.8. The BANNER Command . . . . . . . . . . . . . . . . .  17
  52.                3.9. Controlling the OMIT Context . . . . . . . . . . . .  18
  53.  
  54.           4. PURGING REMINDER FILES  . . . . . . . . . . . . . . . . . .  19
  55.  
  56.           5. DEBUGGING YOUR REMINDER FILE  . . . . . . . . . . . . . . .  19
  57.                5.1. Format of Debugging and Error Messages . . . . . . .  19
  58.  
  59.           6. WISH LIST . . . . . . . . . . . . . . . . . . . . . . . . .  20
  60.  
  61.           7. WISHES LIST . . . . . . . . . . . . . . . . . . . . . . . .  20
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.           REMIND 2.3.0   (19 February 1991)                           Page i
  78.  
  79.  
  80.  
  81.  
  82.  
  83.           1. INTRODUCTION
  84.  
  85.           REMIND version 2.3 is an advanced reminder program.  It is similar
  86.           to the Unix "calendar" program, only much more versatile and with
  87.           enhanced features.
  88.  
  89.           REMIND reads a text file (which you create) containing a list of
  90.           commands.  Most of these commands are "reminders" which are issued
  91.           whenever the current date meets specified criteria.  The reminders
  92.           can print a message to the console or run a program.
  93.  
  94.           Some features of REMIND include the following:
  95.  
  96.           o    Ability to issue a reminder any number of days in advance
  97.  
  98.           o    Ability to skip holidays and weekends when reminding in
  99.                advance
  100.  
  101.           o    Ability to include standard files for system-wide reminders
  102.                or standard sets of holidays
  103.  
  104.           o    Advanced date calculation
  105.  
  106.           o    Ability to run a program rather than display a message when a
  107.                reminder is issued
  108.  
  109.           o    Ability to purge reminder file to remove obsolete reminders
  110.  
  111.           o    Ability to create a calendar with your reminders
  112.                automatically filled in on the appropriate dates
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.           REMIND 2.3.0   (19 February 1991)                           Page 1
  137.  
  138.  
  139.  
  140.  
  141.  
  142.           2. THE FINE PRINT
  143.  
  144.           REMIND is yours to keep, use, distribute and enjoy.  However,
  145.           there are some things you can't do:
  146.  
  147.           i)   You can't claim that you (or anyone other than I) wrote
  148.                REMIND.
  149.  
  150.           ii)  You can't distribute REMIND for profit.
  151.  
  152.           iii) You can't distribute a modified version of REMIND, or a
  153.                version of REMIND which is missing this document.
  154.  
  155.           REMIND is copyright (C) 1990, 1991 by David Skoll.
  156.  
  157.           If you wish to support the creation of software like REMIND, you
  158.           can send me a donation.  Any amount would be appreciated; the
  159.           suggested amount is $18.  Note that this is strictly voluntary. If
  160.           you don't make a donation, you don't suffer any penalties.  If you
  161.           make a donation, you don't get any special service for it.  But
  162.           you will have helped support the creation of useful and
  163.           reasonably-priced software.
  164.  
  165.           My mailing address is:
  166.  
  167.           David Skoll
  168.           4-317 LeBreton Street
  169.           Ottawa, Ontario
  170.           K1S 4L4 Canada
  171.           Tel. (613) 567-3662
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.           REMIND 2.3.0   (19 February 1991)                           Page 2
  196.  
  197.  
  198.  
  199.  
  200.  
  201.           3. USING REMIND
  202.  
  203.           The first thing you need to use REMIND is a reminder file.  This
  204.           is a text file containing commands telling REMIND what to do. 
  205.           Here's a sample reminder file:
  206.  
  207.                # Sample file - by D. Skoll
  208.                BANNER Hi, Dave!  Here are your reminders:
  209.  
  210.                # First some birthdays
  211.                REM 6 Jan MSG David's birthday!
  212.                REM 23 Nov +10 MSG El's birthday is %a.
  213.  
  214.                # Next some housekeeping stuff
  215.                REM 1 -1 OMIT sat sun RUN dobackup.bat
  216.  
  217.                # Introduce some holidays
  218.                OMIT 25 dec      # Christmas
  219.                OMIT 1 jul       # Canada day
  220.                OMIT 22 nov 1990 # American thanksgiving
  221.  
  222.                # Business things
  223.                REM 23 nov 1990 +2 AT 14:00 MSG %"Meeting with Bill%" \
  224.                at %2 %a.
  225.  
  226.           Note that REMIND ignores blank lines and lines beginning with "#". 
  227.           If the last character on a line is a backslash "\", then it is
  228.           treated as a continuation character and the next line is read. 
  229.           You can string together several lines in this fashion, providing
  230.           the total length does not exceed 510 characters.  Also, commands,
  231.           names of months, etc. can be typed in any mixture of upper- and
  232.           lower-case.  The convention I use is to use upper case for REMIND
  233.           tokens like MSG, OMIT, etc. and mixed case for other words like
  234.           January and Sunday.
  235.  
  236.  
  237.           3.1. Running REMIND
  238.  
  239.           To run REMIND, simply type: 
  240.  
  241.                REMIND rem_file
  242.  
  243.           where rem_file is the name of the reminder file.  The full form of
  244.           the REMIND command line is:
  245.  
  246.           REMIND [-n | -d | -p | -c [-w -s]] [-vor] rem_file [date_spec]
  247.  
  248.           Items in square brackets are optional.  Note that you can use one
  249.           of the -d and -p options, but not both.  The meanings of the
  250.           options are:
  251.  
  252.  
  253.  
  254.           REMIND 2.3.0   (19 February 1991)                           Page 3
  255.  
  256.  
  257.  
  258.  
  259.  
  260.           -n   Next mode - in this mode, REMIND simply prints the next
  261.                occurrence of each reminder in a "Simple Calendar" format.
  262.  
  263.           -d   Debug mode - runs through the reminder file printing useful
  264.                information to the standard error stream.
  265.  
  266.           -p   Purge mode - purges expired reminders from the reminder file.
  267.  
  268.           -c   Calendar mode - this causes REMIND to produce a calendar for
  269.                the current month.  If you supply a number n from 1 to 12
  270.                after the c (eg, -c6), then the calendar is produced for n
  271.                months.
  272.  
  273.           -w   When used with the -c option, specify the width of the
  274.                display device when producing a calendar.  The default is -
  275.                w80; you can specify a different width. (Eg -w132 for a 132-
  276.                column printer.)
  277.  
  278.           -s   When used with the -c option, produce a "simple" calendar
  279.                listing rather than a formatted calendar.  This is useful if
  280.                you wish to write a program which produces a "prettier"
  281.                calendar than the REMIND default.
  282.  
  283.           -v   Verbose mode - prints long error and debugging messages.
  284.  
  285.           -o   Ignore the 'ONCE' directives in the reminder file.  (See the
  286.                section "Getting Reminded only Once per Day")
  287.  
  288.           -r   Ignore the 'RUN' directives in the reminder file. (See the
  289.                section "The RUN Keyword")
  290.  
  291.           date_spec Run the reminder file as if the current date were the
  292.                     specified date.  This allows you to see what reminders
  293.                     you'll get on a date in the future.  This date must be
  294.                     specified in full - for example, "6 July 1992" or "Dec
  295.                     12 1999"
  296.  
  297.           3.2. The REM Command
  298.  
  299.           The most-used command in the reminder file is the REM command. 
  300.           This command is used to denote a reminder.  The form of the REM
  301.           command is:
  302.  
  303.           REM [ONCE] [BEFORE | AFTER | SKIP] [date_spec] [delta] [back]
  304.                [repeat] [OMIT omit_list] [AT time [tdelta] [trepeat]] [UNTIL
  305.                expiry_date] <MSG | RUN> body
  306.  
  307.           Note that these should all be on one line; the descriptions
  308.           unfortunately are too long to fit on one line.  The components of
  309.           a REM command can appear in any order.
  310.  
  311.  
  312.  
  313.           REMIND 2.3.0   (19 February 1991)                           Page 4
  314.  
  315.  
  316.  
  317.  
  318.  
  319.           3.2.1. Date specifications
  320.  
  321.           The date_spec consists of zero to four parts.  These parts are DAY
  322.           (day of month), MONTH (month name), YEAR and WEEKDAY.  MONTH and
  323.           WEEKDAY are the English names of months and weekdays.  At least
  324.           the first three characters must be used.  Case is irrelevant.  The
  325.           following are examples of the various parts of a date
  326.           specification:
  327.  
  328.           DAY:      1, 22, 31, 14, 3
  329.  
  330.           MONTH:    JANUARY, feb, March, ApR, may, june, Jul, August
  331.  
  332.           YEAR:     1990, 1993, 2030, 95 (Interpreted as 1995)
  333.                     The YEAR can range from 1990 to 2075.
  334.  
  335.           WEEKDAY:  Monday, tue, WED, Thu, Friday, saturday, sundAy
  336.  
  337.           Note that there can be several WEEKDAY components separated by
  338.           spaces.  The interpretation of date specifications is discussed
  339.           below.
  340.  
  341.           The date specification is used by REMIND to compute a TRIGGER
  342.           DATE.  The trigger date is the date on which a reminder will take
  343.           place.  Here are examples of how trigger dates are computed:
  344.  
  345.           1.   Null date_spec.  The reminder is triggered every day - the
  346.                trigger date is simply the system date.
  347.  
  348.           2.   Only DAY present.  The reminder is triggered on the specified
  349.                day of each month.  The trigger date is the closest such date
  350.                to the system date.  For example:
  351.                REM 1 MSG Triggered on first of every month.
  352.                REM 31 MSG Triggered on 31st of every month with 31 days.
  353.  
  354.           3.   Only MONTH present:  Triggered every day of the specified
  355.                month.  Example:
  356.                REM feb MSG Triggered every day in February.
  357.  
  358.           4.   DAY and MONTH present.  Examples:
  359.                REM 6 Jan MSG Triggered every 6th of January.
  360.                REM 29 Feb MSG Triggered every 29th of February.
  361.  
  362.           5.   YEAR present. Example:
  363.                REM 1990 MSG Triggered every day in 1990.
  364.  
  365.           6.   YEAR and DAY present. Examples:
  366.                REM 1 1990 MSG Triggered on first of every month in 1990.
  367.                REM 1991 23 MSG Triggered on 23rd of every month of 1991.
  368.  
  369.  
  370.  
  371.  
  372.           REMIND 2.3.0   (19 February 1991)                           Page 5
  373.  
  374.  
  375.  
  376.  
  377.  
  378.           7.   YEAR and MONTH present. Examples:
  379.                REM Feb 1990 MSG Triggered every day in February 1990.
  380.                REM 1991 September MSG Triggered every day in September 1991.
  381.  
  382.           8.   YEAR, MONTH and DAY present. Examples:
  383.                REM 8 January 1991 MSG Triggered on 8 Jan 1991 only.
  384.                REM 1992 March 9 MSG Triggered on 9 March 1991 only.
  385.  
  386.           9.   WEEKDAY only.  Examples:
  387.                REM Saturday MSG Triggered every Saturday.
  388.                REM mon tue wed thu fri MSG Triggered every working day.
  389.                REM mon wed MSG Triggered every Monday and Wednesday.
  390.  
  391.           10.  WEEKDAY and DAY.  Examples:
  392.                REM Sat 1 MSG Triggered on the first Saturday of each month.
  393.                REM Mon Tue Wed Thu Fri 15 MSG Triggered on the first working
  394.                     day on or after the 15th of each month.
  395.  
  396.           11.  WEEKDAY and MONTH.  Examples:
  397.                REM mon march MSG Triggered every Monday in March.
  398.                REM mon tue wed thu fri feb MSG Triggered every working day
  399.                     in February.
  400.  
  401.           12.  WEEKDAY, MONTH and DAY.  Examples:
  402.                REM mon 1 March MSG Triggered on the first Monday in March
  403.                REM sat sun 15 July MSG Triggered on the first Saturday or
  404.                     Sunday on or after the 15th of July.
  405.  
  406.           13.  WEEKDAY and YEAR.  Example:
  407.                REM sat sun 1991 MSG Triggered every Saturday and Sunday in
  408.                     1991.
  409.  
  410.           14.  WEEKDAY, DAY and YEAR.  Examples:
  411.                REM mon 15 1990 MSG First Monday after the 15th of every
  412.                     month in 1990.
  413.                REM mon tue wed thu fri 1 1990 MSG First working dat of
  414.                     every month in 1990.
  415.  
  416.           15.  WEEKDAY, MONTH and YEAR.  Example:
  417.                REM Mon Wednesday 1991 Feb MSG Every Monday and Wednesday in
  418.                     February 1991.
  419.  
  420.           16.  WEEKDAY, DAY, MONTH and YEAR.  Example:
  421.                REM mon tue wed thu fri 28 Oct 1990 MSG First working day on
  422.                     or after 28 October 1990.
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.           REMIND 2.3.0   (19 February 1991)                           Page 6
  432.  
  433.  
  434.  
  435.  
  436.  
  437.           Note that when WEEKDAY and DAY are specified, REMIND chooses the
  438.           first date on or after the specified DAY which also satisfies the
  439.           WEEKDAY constraint.  It does this by picking the first date on or
  440.           after the specified DAY which is listed in the list of WEEKDAYs. 
  441.           Thus, a reminder like
  442.  
  443.                REM Mon Tue 28 Oct 1990 MSG Hi
  444.  
  445.           would be issued only on Monday, 29 October, 1990.  It would not be
  446.           issued on Tuesday, 30 October, 1990 since the 29th satisfies the
  447.           constraints.
  448.  
  449.           3.2.2. Backward Scanning
  450.  
  451.           Sometimes, you need to incorporate "backward scanning" into your
  452.           date specification.  This is accomplished with the "back" part of
  453.           the reminder specification.  If present, the back is specified as
  454.           a number preceded by one or two minus signs.  (The distinction
  455.           between the "-x" and "--x" forms will be explained in "The OMIT
  456.           Command.")  This causes REMIND to compute the trigger date and
  457.           then move back the specified number of days.  For example:
  458.  
  459.                REM Mon 1 --7 MSG The LAST Monday of every month.
  460.  
  461.           This works by finding the first Monday of every month and then
  462.           moving "back" seven days.  This results in the last Monday of the
  463.           previous month.  Another example:
  464.  
  465.                REM 1 -1 MSG The LAST day of every month.
  466.  
  467.           Since we don't know how many days are in a month, to get to the
  468.           last day of a month, we go to the first day of the next month and
  469.           then move back one day.
  470.  
  471.           Remind will automatically scan forwards and backwards until it
  472.           finds a trigger date meeting the criteria.  Note that a back value
  473.           greater than 7 can lead to excessive backtracking and long
  474.           execution time.
  475.  
  476.           3.2.3. Advance Warning
  477.  
  478.           REMIND can warn you of an upcoming reminder as far in advance as
  479.           you desire.  This is specified by a delta, which is a positive
  480.           number prefaced with one or two "+" signs.  (The distinction
  481.           between the "+" and "++" forms will be explained in "The OMIT
  482.           Command")  For example:
  483.  
  484.                REM 8 Jan 1992 +3 MSG This reminder is emitted starting 3
  485.                     days before January 8 1992.
  486.  
  487.                REM 1 ++1 MSG This reminder is emitted on the first of every
  488.                     month, as well as the last day of the preceding month.
  489.  
  490.           REMIND 2.3.0   (19 February 1991)                           Page 7
  491.  
  492.  
  493.  
  494.  
  495.  
  496.           In summary, a reminder with a delta is triggered on the usual
  497.           date, as well as all days preceding the trigger date by up to
  498.           "delta" days.  This is useful for being reminded of birthdays well
  499.           in advance!
  500.  
  501.           Deltas and backs can be combined:
  502.  
  503.                REM Mon 1 -7 +3 MSG Emitted on the last Monday of every month
  504.                     as well as the 3 days preceding it.
  505.           3.2.4. The MSG Keyword
  506.  
  507.           The MSG keyword causes the remaining part of the line to be
  508.           printed to standard output when the reminder is triggered.  The
  509.           line is first passed through a substitution routine before being
  510.           printed.  See the section "Substitution" for details about
  511.           substitution.
  512.  
  513.           3.2.5. The RUN Keyword
  514.  
  515.           The RUN keyword causes the remaining part of the line to be passed
  516.           through the substitution routine, and then passed to the shell for
  517.           execution as if you had typed the command at the shell prompt. 
  518.  
  519.           3.2.6. Getting Reminded only Once per Day
  520.  
  521.           In some situations, you only want a reminder emitted once per day. 
  522.           This is useful if the reminder runs a program which should be run
  523.           only once.  (Typically, such a reminder would have no delta. 
  524.           Otherwise, the program would be run once for each day within the
  525.           delta preceding the trigger date.)
  526.  
  527.           When REMIND finishes processing a file, it marks the modification
  528.           date of the file with the current system date.  When it is run the
  529.           next time, if the file modification date and the system date are
  530.           the same, it ignores reminders which contain the ONCE keyword. 
  531.           For example:
  532.  
  533.                REM ONCE 1 Mon RUN do_backup
  534.  
  535.           This reminder runs the program "do_backup" on the first Monday of
  536.           each month.  It runs it only the first time REMIND is invoked.  If
  537.           REMIND is subsequently invoked on the same day, this reminder is
  538.           ignored.
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.  
  546.  
  547.  
  548.  
  549.           REMIND 2.3.0   (19 February 1991)                           Page 8
  550.  
  551.  
  552.  
  553.  
  554.  
  555.           3.2.7. Locally Omitting Weekdays
  556.  
  557.           A reminder containing the keyword OMIT followed by a list of
  558.           weekdays causes the delta and back to ignore the specified days
  559.           when moving backwards.  This is called a "local omit." For
  560.           example:
  561.  
  562.                REM 1 +1 OMIT sat sun MSG Hello there!
  563.  
  564.           This reminder prints the message "Hello there!" on the first day
  565.           of each month, and the day before.  If, however, the first day of
  566.           the month falls on a Sunday or Monday, the message is also issued
  567.           on the preceding Friday, since the delta does not count Saturday
  568.           and Sunday as it moves backwards.
  569.  
  570.                REM 1 -1 +1 OMIT sat sun MSG Hi there!
  571.  
  572.           This one issues a reminder on the last working day of each month,
  573.           as well as the preceding working day.  Let's look at it in detail:
  574.  
  575.           The "1" specifies the first of each month.  The "back" of -1 tells
  576.           REMIND to go backwards by one day, not counting Saturday and
  577.           Sunday as it moves.  This takes us to the last working day of the
  578.           preceding month.  The delta of +1 ensures that the reminder will
  579.           be emitted on the day preceding this day also.  Finally, if the
  580.           last working day of the month happens to be a Monday, the delta
  581.           combined with the local OMIT causes the reminder to be issued the
  582.           Friday before.  Play around with deltas, backs and OMITs.  They
  583.           can be very powerful and quickly become easy to understand.
  584.  
  585.           3.2.8. Periodic Reminders
  586.  
  587.           Sometimes reminders repeat periodically, where the repetition
  588.           period is a specific number of days.  To create a repeating
  589.           reminder, use the "repeat" item, which is a number preceded by an
  590.           asterisk.  (Example: *14)  You supply a start date and the
  591.           repetition factor, and REMIND will trigger the reminder
  592.           periodically.  Note that to use a repetition factor, you must
  593.           specify DAY, MONTH and YEAR in the date-spec.  You can use
  594.           WEEKDAYS, deltas, backs and OMITS in the date-spec.  However,
  595.           these are used ONLY in the calculation of the start date.  Once
  596.           the start date has been calculated, OMITs are ignored and the
  597.           reminder is triggered in strict multiples of the period after the
  598.           start date.
  599.  
  600.           For example, suppose you get paid every second Thursday, and that
  601.           8 November 1990 was a payday.  You can be reminded of your payday
  602.           with this reminder:
  603.  
  604.                REM 8 Oct 1990 +3 *14 MSG Payday is %b.
  605.  
  606.           The delta of +3 means you'll be warned 3 days ahead of every
  607.  
  608.           REMIND 2.3.0   (19 February 1991)                           Page 9
  609.  
  610.  
  611.  
  612.  
  613.  
  614.           payday.  The repeat of *14 means that the reminder will be
  615.           triggered every 14 days starting from 8 October 1990.
  616.  
  617.           3.2.9. The AT Keyword
  618.  
  619.           The AT keyword specifies a time for reminders which have times
  620.           associated with them.  You should follow the AT keyword with a
  621.           time in 24-hour format, from 0:00 to 23:59.  The tdelta and
  622.           trepeat items have the same format as delta and repeats for dates. 
  623.           They are used in the UNIX version of REMIND to specify how many
  624.           minutes and over what interval to repeatedly pop up timed
  625.           reminders.  These fields are accepted by the MS-DOS version of
  626.           REMIND, but do not serve any useful purpose.  The AT keyword does,
  627.           however, cause reminders to be sorted by time when placed on the
  628.           calendar listing.  Here are examples of how to use AT:
  629.  
  630.           REM AT 17:00 MSG Work ends at %2!
  631.           REM 8 July 1991 AT 10:00 MSG Meeting with Bill %1.
  632.  
  633.           3.2.10. The BEFORE, SKIP and AFTER Keywords
  634.  
  635.           Normally, if a reminder falls on a holiday (see "The OMIT
  636.           Command"), the reminder is still issued.  This can cause some
  637.           strange effects.  Consider the following:
  638.  
  639.           OMIT 25 Dec    # Xmas Holiday
  640.           OMIT 1 Jan     # New Year's Day
  641.           REM Tue MSG Departmental meeting.
  642.  
  643.           The reminder "Departmental meeting"  would be issued every
  644.           Tuesday, including 25 December, 1990, and 1 January, 1991, even
  645.           though those days are holidays.  If, however, you use the SKIP
  646.           keyword:
  647.  
  648.           REM SKIP Tue MSG Departmental meeting.
  649.  
  650.           then the reminder would be issued every Tuesday, except on those
  651.           Tuesdays which happen to be holidays.  The BEFORE keyword would
  652.           cause the reminder to be issued on Tuesdays, unless the Tuesday is
  653.           a holiday.  In that case, the reminder would be issued the Monday
  654.           before.  The AFTER keyword is similar, except that the reminder
  655.           would be issued on the Wednesday following any holidays occurring
  656.           on Tuesday.
  657.  
  658.           In summary:  The SKIP keyword causes reminder which happen to fall
  659.           on globally or locally omitted days not to be issued.  The BEFORE
  660.           keyword moves reminders to the first non-omitted day prior to the
  661.           holiday.  The AFTER keyword moves them to the first non-omitted
  662.           day after the holiday.  Here are some examples:
  663.  
  664.           REM AFTER 1 OMIT Sat Sun RUN Backup_on_first_working_day_of_month
  665.           REM SKIP Tue MSG Weekly Meeting
  666.  
  667.           REMIND 2.3.0   (19 February 1991)                          Page 10
  668.  
  669.  
  670.  
  671.  
  672.  
  673.           REM BEFORE 4 Dec 1991 *14 MSG Payday on every second Tuesday;\
  674.                Monday if that Tuesday happens to be a holiday.
  675.  
  676.  
  677.           3.3. The OMIT Command
  678.  
  679.           In addition to being part of a REM command, the OMIT keyword can
  680.           act as a command in its own right.  When used this way, it is
  681.           called a "global omit" and is used to specify holidays.  The OMIT
  682.           command has two forms:
  683.  
  684.                OMIT month day
  685.                OMIT year month day
  686.  
  687.           The components can be in any order.  For convenience, you can also
  688.           specify a DELTA and a RUN or MSG, as with the REM command.  This
  689.           is used to avoid duplication.  For example, the command:
  690.  
  691.                OMIT 25 Dec +3 MSG %"Christmas%" is %a.
  692.  
  693.           is exactly equivalent to:
  694.  
  695.                OMIT 25 Dec
  696.                REM 25 Dec +3 MSG %"Christmas%" is %a.
  697.  
  698.           The first format is used for holidays which fall on the same day
  699.           each year.  For example:
  700.  
  701.                OMIT 25 December  # Christmas
  702.                OMIT 1  January   # New year's day.
  703.  
  704.           The second format is used for holidays which move from year to
  705.           year.  For example:
  706.  
  707.                OMIT 12 October 1990 # Columbus day 1990
  708.                OMIT 22 November 1990 # Thanksgiving day 1990
  709.  
  710.           These dates are omitted by the "back" and "delta" portions of a
  711.           reminder, in addition to any local omits.  For example:
  712.  
  713.                OMIT 25 December
  714.                REM 26 +1 OMIT sat sun MSG Test2
  715.  
  716.           This would issue the reminder on the 26th of each month, as well
  717.           as the working day preceding it.  Also, on the 24th of December,
  718.           1990, the reminder would be issued.  Even though Christmas 1990 is
  719.           on a Tuesday, the global OMIT would cause the delta to skip it.
  720.  
  721.           Global OMITS are in force for all reminders following them in the
  722.           reminder file.  Thus, you could have a series of reminders like
  723.           birthdays, etc. for which global omits may not be necessary.  You
  724.           can then place the global holiday list in your file, followed by
  725.  
  726.           REMIND 2.3.0   (19 February 1991)                          Page 11
  727.  
  728.  
  729.  
  730.  
  731.  
  732.           business reminders for which omission of holidays would be
  733.           appropriate.
  734.  
  735.           3.3.1. The "+" and "-" Forms vs "++" and "--"
  736.  
  737.           The "+" and "-" forms of "back" and "delta" normally do not count
  738.           OMITted days when they count backwards.  The is useful, for
  739.           example, to issue a reminder on the last working day of the month:
  740.  
  741.                REM 1 -1 OMIT Sat Sun MSG Boo!
  742.  
  743.           However, sometimes it is inconvenient to have the "back" and
  744.           "delta" skip OMITted days.  For example, if you want a reminder on
  745.           the last Monday of every month regardless of any intervening
  746.           global OMITs, you can use:
  747.  
  748.                REM 1 Mon --7 MSG Last Monday of month, for sure!
  749.  
  750.           The "++" and "--" forms perform strict date subtraction, whereas
  751.           the "+" and "-" forms do not count locally and globally OMITted
  752.           days.  One last example:
  753.  
  754.                REM 1 Mon --7 AFTER MSG Last Monday of month, unless \
  755.                it's a holiday, in which case the following Tuesday.
  756.  
  757.           3.4. The UNTIL Keyword
  758.  
  759.           You can force a reminder to expire after a specified date by using
  760.           the UNTIL keyword followed by DAY, MONTH and YEAR in any order. 
  761.           You can use this to create reminders of events which repeat over
  762.           an interval.  For example, suppose you have jury duty from 25
  763.           February 1991 to 8 March 1991, not including weekends.  Suppose
  764.           also that you wish to be warned starting on 22 February 1991.  You
  765.           could use:
  766.  
  767.                REM 25 Feb 1991 *1 ++3 OMIT Sat Sun SKIP UNTIL 8 Mar 1991 \
  768.                MSG Jury Duty %b.
  769.  
  770.           The REPEAT of "*1" is necessary to have the reminder issued every
  771.           day during the interval.  The "++3" provides advance warning; the
  772.           local OMIT combined with SKIP causes the weekends to be skipped,
  773.           and the UNTIL clause causes the reminder to expire on the
  774.           specified date.
  775.  
  776.           Another example:  Suppose you have a class every Wednesday until
  777.           29 May 1991.  Use:
  778.  
  779.                REM Wed UNTIL 29 May 1991 MSG Class!
  780.  
  781.  
  782.  
  783.  
  784.  
  785.           REMIND 2.3.0   (19 February 1991)                          Page 12
  786.  
  787.  
  788.  
  789.  
  790.  
  791.           3.5. The INCLUDE Command
  792.  
  793.           The INCLUDE command takes the following form:
  794.  
  795.                INCLUDE filename
  796.  
  797.           This causes REMIND to suspend the current file and read the
  798.           contents of the specified filename.  Once that file has been read,
  799.           REMIND continues reading the original file from the line after the
  800.           INCLUDE command.  INCLUDEs can be nested to a maximum level of 10.
  801.  
  802.           INCLUDE allows you or someone else to maintain a file of standard
  803.           holidays (global OMITS) or system-wide reminders that everyone
  804.           should get.  For example, your local reminder file could look like
  805.           this:
  806.  
  807.                # Example shown for MS-DOS
  808.                INCLUDE \etc\holidays.sys  # System-wide holidays
  809.                INCLUDE \etc\remind.sys    # Standard system-wide reminders
  810.  
  811.                # Now my private reminders go here.
  812.  
  813.           When you're PURGING a file (See the section "Purging Reminder
  814.           Files" ) only the top-level file is used for purging.  Any
  815.           INCLUDEd files are read and processed, but not purged.
  816.  
  817.           The ONCE keyword operates on the modification date of the top-
  818.           level file.  The modification dates of INCLUDEd files are not used
  819.           to control the operation of the ONCE keyword.
  820.  
  821.           3.6. Substitution
  822.  
  823.           Before being processed, the body of a RUN or MSG command is run
  824.           through a substitution filter.  This filter makes certain
  825.           substitutions in the body.  The substitutions are marked by a '%'
  826.           symbol followed by a letter.  Whenever these sequences occur, they
  827.           are replaced with text as determined below.  All dates referred to
  828.           are the trigger date of the specified reminder.
  829.  
  830.           %a * Replaced with "on WKDAY, DAY MONTH, YEAR"
  831.  
  832.                For example, consider the reminder:
  833.                "REM 18 Oct 1990 +4 MSG Meeting with Bob %a."
  834.  
  835.                If reminder were run on 16 October 1990, this would print:
  836.                "Meeting with Bob on Thursday, 18 October, 1990."
  837.  
  838.                On 17 October 1990, the message would be:
  839.                "Meeting with Bob tomorrow."
  840.  
  841.                On 18 October 1990, it would be:
  842.                "Meeting with Bob today."
  843.  
  844.           REMIND 2.3.0   (19 February 1991)                          Page 13
  845.  
  846.  
  847.  
  848.  
  849.  
  850.           %b * Replaced with "in DIFF days' time"
  851.  
  852.                Example:  "REM 18 Oct 1990 +4 MSG Meeting with Bob %b."
  853.  
  854.                16 Oct 1990: "Meeting with Bob in 2 days' time."
  855.                17 Oct 1990: "Meeting with Bob tomorrow."
  856.                18 Oct 1990: "Meeting with Bob today."
  857.  
  858.                Note that the number printed is the ACTUAL number of days
  859.                between the current date and the trigger date.  The OMIT
  860.                lists have no effect on this number.
  861.  
  862.           %c * Replaced with "on WKDAY"
  863.  
  864.                Example:  "REM 18 Oct 1990 +4 MSG Meeting with Bob %b."
  865.  
  866.                16 Oct 1990: "Meeting with Bob on Thursday."
  867.                17 Oct 1990: "Meeting with Bob tomorrow."
  868.                18 Oct 1990: "Meeting with Bob today."
  869.  
  870.           %d   Replaced with the day of the month.
  871.  
  872.           %e * Replaced with "on dd/mm/yyyy"
  873.  
  874.           %f * Replaced with "on mm/dd/yyyy"
  875.  
  876.           %g * Replaced with "on WKDAY, DAY MONTH"
  877.  
  878.           %h * Replaced with "on dd/mm"
  879.  
  880.           %i * Replaced with "on mm/dd"
  881.  
  882.           %j * Replaced with "on WKDAY, MONTH DAYth, YEAR"
  883.  
  884.                This is replaced with things of the form "on Monday, October
  885.                8th, 1990" or "on Sunday, October 21st, 1990" with the "st",
  886.                "nd", "rd", "th" as appropriate after the day of the month.
  887.  
  888.           %k * Replaced with "on WKDAY, MONTH DAYth"
  889.  
  890.           %l * Replaced with "on yyyy/mm/dd"
  891.  
  892.           %m   Replaced with the name of the month.
  893.  
  894.           %n   Replaced with the number (1 - 12) of the month.
  895.  
  896.           %o   Replaced with " (today)" if and only if the current system
  897.                date is the same as the date used by REMIND as the current
  898.                date.  Recall that you can specify a date for REMIND to use
  899.                on the command line.  This substitution is not generally
  900.                useful in a REMinder, but is useful in a BANNER statement. 
  901.                See the section 'The BANNER Command'.
  902.  
  903.           REMIND 2.3.0   (19 February 1991)                          Page 14
  904.  
  905.  
  906.  
  907.  
  908.  
  909.           %p   Replaced with "s" if the DIFF between the current date and
  910.                the trigger date is not 1.  You can use this to construct
  911.                reminders like:
  912.  
  913.                REM 1 Jan +4 MSG %x day%p to go before New Year's Day!
  914.           %q   Replaced with "'s" if the DIFF between the current date and
  915.                trigger date is 1.  Otherwise, replaced with "s'"  This can
  916.                be used as follows:
  917.  
  918.                REM 1 Jan +4 MSG New Year's Day in %x day%q time!
  919.  
  920.           %r   Replaced with the day of the month (01-31) with leading zero
  921.                if needed to pad to two digits.
  922.  
  923.           %s   Replaced with "st", "nd", "rd" or "th" depending on the day
  924.                of the month.  Example:
  925.  
  926.                REM 1 Mon +3 MSG First Monday of %m is the %d%s.
  927.  
  928.                For October, 1990, this would print:
  929.                "First Monday of October is the 1st."
  930.  
  931.                For November, 1990, it would print:
  932.                "First Monday of November is the 5th."
  933.  
  934.           %t   The number of the month (01 - 12) padded to two digits with
  935.                leading zero if necessary.
  936.  
  937.           %u * Replaced with "on WKDAY, DAYth MONTH, YEAR"
  938.                This is the same as %a except "st", "nd", etc. is added to
  939.                the day of the month.
  940.  
  941.           %v * Replaced with "on WKDAY, DAYth MONTH"
  942.  
  943.           %w   Replaced with "WKDAY", the name of the day of the week.
  944.  
  945.           %x   Replaced with the DIFF between the current date and the
  946.                trigger date.  The DIFF is defined as the number of days
  947.                between the current date and the trigger date.  OMITs are not
  948.                counted; strict date subtraction is performed.
  949.  
  950.           %y   Replaced with "YEAR", the year of the trigger date.
  951.  
  952.           %z   Replaced with "yy", the last two digits of the year.
  953.  
  954.           %_   (Percent-underscore) replaced with a newline.  You can use
  955.                this to achieve multi-line reminders.
  956.  
  957.  
  958.  
  959.  
  960.  
  961.  
  962.           REMIND 2.3.0   (19 February 1991)                          Page 15
  963.  
  964.  
  965.  
  966.  
  967.  
  968.           %1   Replaced with "now", "m minutes from now", "m minutes ago",
  969.                "h hours from now", "h hours and m minutes from now", etc.,
  970.                as appropriate for a timed reminder.  Note that timer
  971.                reminders are triggered like normal reminders - only the date
  972.                portion is considered.  This causes the need for the "...ago"
  973.                forms.
  974.  
  975.           %2   Replaced with "hh:mm" followed by "am" or "pm" as
  976.                appropriate.
  977.           %3   Replaced with "hh:mm", the AT time in 24-hour format.
  978.  
  979.           %4   Replaced with "mm", where mm is the number of minutes between
  980.                "now" and the time specified by AT.  If the AT time is
  981.                earlier than the current time, this number is negative.
  982.  
  983.           %5   Replaced with "ma", where ma is the absolute value of the
  984.                number produced by %4.
  985.  
  986.           %6   Replaced with "ago" or "from now", depending on the
  987.                relationship between the AT time and the current time.
  988.  
  989.           %7   Replaced with the number of hours between the current time
  990.                and the AT time.  This number is always non-negative.
  991.  
  992.           %8   Replaced with the number of minutes between the current time
  993.                and the AT time, after the hours (%7) have been subtracted
  994.                out.  This is a number from 0 to 59.
  995.  
  996.           %9   Replaced with "s" if the number produced by "%8" is not 1.
  997.  
  998.           %0   Replaced with "s" if the number produced by "%7" is not 1.
  999.  
  1000.           %!   Replaced with "is" if the current time is before the AT time,
  1001.                or "was" if it is after.
  1002.  
  1003.           %"   (percent-doublequote) is removed.  This sequence is not used
  1004.                by the substitution filter, but is used to tell REMIND which
  1005.                text to include in a calendar entry when the -c option is
  1006.                chosen.  See the section "Producing a Calendar"
  1007.  
  1008.           Notes:
  1009.  
  1010.           o    REMIND normally prints a blank line after each reminder. 
  1011.                However, if the last character of the body is "%", then the
  1012.                blank line will not be printed.
  1013.  
  1014.           o    All substitution sequences marked with "*" are replaced with
  1015.                "today" if the current date equals the trigger date, or
  1016.                "tomorrow" if the trigger date is one day after the current
  1017.                date.
  1018.  
  1019.           o    Any of the substitutions dealing with time (0 though 9 and
  1020.  
  1021.           REMIND 2.3.0   (19 February 1991)                          Page 16
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027.                "!") produce undefined results if used in a reminder without
  1028.                the AT keyword.  Also, if a reminder has a delta and may be
  1029.                triggered on several days, the time substitutions ignore the
  1030.                date.  Thus, the "%1" substitution may report that a meeting
  1031.                is in 15 minutes, for example, even though it may only be in
  1032.                2 days time.  It is recommended that you use the "%1"
  1033.                substitution only on reminders with no delta.
  1034.           o    Capital letters can be used, in which case the first letter
  1035.                of the substituted text is capitalized.
  1036.  
  1037.           o    All other characters following a "%" sign are simply copied. 
  1038.                In particular, to get a "%" sign out, use "%%" in the body. 
  1039.                To start a body with a space, use "% " since REMIND normally
  1040.                scans for the first non-space character after the MSG or RUN
  1041.                token.
  1042.  
  1043.           3.7. Producing a Calendar
  1044.  
  1045.           REMIND can be used to create a calendar based on the contents of
  1046.           your reminder file.  This is done by invoking REMIND with the -c
  1047.           option.
  1048.  
  1049.           When you produce a calendar, REMIND will pass the text through the
  1050.           substitution mechanism.  In addition, you may indicate to REMIND
  1051.           which portions of the text should be placed in the calendar.  This
  1052.           is done with the %" sequence.  Here's an example:
  1053.  
  1054.                REM 6 Jan +6 MSG %"David's birthday%" is %a.
  1055.  
  1056.           When you run REMIND normally, it triggers the reminder as if the
  1057.           %" sequences were not there.  When you produce a calendar with the
  1058.           -c option, however, only the text "David's birthday" is placed
  1059.           into the calendar.  For convenience, timed reminders are sorted by
  1060.           time before being entered into the calendar, and the time of each
  1061.           reminder is printed before the text.
  1062.  
  1063.           Note that only MSG reminders are included in the calendar; RUN
  1064.           reminders are ignored.  However, if you explicitly indicate text
  1065.           in a RUN reminder with %" signs, it will be placed in the
  1066.           calendar.  If you indicate empty text for the calendar entry with
  1067.           the sequence %"%" in the reminder body, then the reminder will be
  1068.           ignored when producing the calendar.
  1069.  
  1070.           3.8. The BANNER Command
  1071.  
  1072.           When REMIND issues reminders, it normally prints a message saying:
  1073.  
  1074.                "Reminders for WKDAY, DAYth MONTH, YEAR (today):" 
  1075.  
  1076.           if it is running with the current date equal to the system date. 
  1077.           If it is running with a different date supplied via the command
  1078.           line, it leaves out the " (today):"
  1079.  
  1080.           REMIND 2.3.0   (19 February 1991)                          Page 17
  1081.  
  1082.  
  1083.  
  1084.  
  1085.  
  1086.  
  1087.           You can change this default to anything you want with the BANNER
  1088.           command.  It should appear in the reminder file before any REM
  1089.           commands.  (This is not enforced, but a BANNER command encountered
  1090.           after a reminder has been issued will be ignored.)
  1091.  
  1092.           The format of BANNER is:  BANNER string
  1093.  
  1094.           The string is passed through the substitution mechanism described
  1095.           above, using the current date for substitution.  The standard
  1096.           banner is described by:
  1097.  
  1098.                BANNER Reminders for %w, %d%s %m, %y%o:
  1099.  
  1100.           You can have a blank banner by using:
  1101.  
  1102.                BANNER %
  1103.  
  1104.           3.9. Controlling the OMIT Context
  1105.  
  1106.           Sometimes, you INCLUDE files which add global OMITs that you don't
  1107.           need or want.  Other times, you need to introduce a global OMIT
  1108.           for one peculiar reminder, but don't want it for other reminders. 
  1109.           Three commands allow you to insulate changes in the OMIT context
  1110.           between reminders.
  1111.  
  1112.           CLEAR-OMIT-CONTEXT will discard all global OMITs and start you out
  1113.           with a clean slate.
  1114.  
  1115.           PUSH-OMIT-CONTEXT will save all the global OMITs onto an internal
  1116.           stack and leave the current context unchanged.
  1117.  
  1118.           POP-OMIT-CONTEXT will restore the OMIT context saved by the last
  1119.           PUSH-OMIT-CONTEXT.
  1120.  
  1121.           Here's an example - suppose you have a block of reminders or an
  1122.           include file which expects to start out with no global OMITs. 
  1123.           Suppose that it introduces global OMITs which you don't want to
  1124.           affect any of your other reminders.  Here's how to achieve this:
  1125.  
  1126.                # blah blah blah
  1127.  
  1128.                PUSH-OMIT-CONTEXT    # Save for later
  1129.                CLEAR-OMIT-CONTEXT   # Start out with clean slate
  1130.  
  1131.                # Put block or INCLUDE file here
  1132.  
  1133.                POP-OMIT-CONTEXT     # Get back the OMITs - now the effects
  1134.                                     # of the block or INCLUDE file are gone.
  1135.  
  1136.  
  1137.  
  1138.  
  1139.           REMIND 2.3.0   (19 February 1991)                          Page 18
  1140.  
  1141.  
  1142.  
  1143.  
  1144.  
  1145.           4. PURGING REMINDER FILES
  1146.  
  1147.           You should periodically purge your reminder file of "expired" REM
  1148.           commands and OMITs.  These are reminders which took place in the
  1149.           past and can never happen again, or OMITs which are for past
  1150.           years.  Of course, only REMs and OMITs with the YEAR specified can
  1151.           ever expire.
  1152.  
  1153.           To purge your file, run REMIND in purge mode.  This mode simply
  1154.           echoes non-expired lines to standard output, and expired lines to
  1155.           standard error.  Thus, to purge a file, you could type:
  1156.  
  1157.                REMIND -p notes.old > notes.new
  1158.  
  1159.           The file "notes.new" would contain all non-expired lines from
  1160.           notes.old.  All expired lines would be echoed to the screen. 
  1161.           INCLUDEd files are read and processed, but are not purged.  You
  1162.           must purge each INCLUDEd file separately.
  1163.  
  1164.           Note that reminders which do not specify a YEAR, as well as
  1165.           repeating reminders, can never expire.
  1166.  
  1167.           You can supply a date on the command line when purging, but
  1168.           beware:  If you supply a date in the future, you may inadvertantly
  1169.           purge lines which have not really expired yet.
  1170.  
  1171.           5. DEBUGGING YOUR REMINDER FILE
  1172.  
  1173.           The debug flag (-d) is used to debug reminder files (not the
  1174.           REMIND program!)  It tells you all sorts of useful information
  1175.           about the reminder file.  It displays the trigger date of each
  1176.           reminder, and places an asterisk by those which would be issued on
  1177.           the current date.  It also informs you of OMITs which have
  1178.           expired, and gives several warnings about situations which could
  1179.           lead to long execution time or unexpected results.
  1180.  
  1181.           If you have a long reminder file, you may want to redirect the
  1182.           standard error stream.  In Unix, this is accomplished easily.  In
  1183.           MS-DOS, you can use the E2O program supplied with REMIND.
  1184.  
  1185.           5.1. Format of Debugging and Error Messages
  1186.  
  1187.           REMIND prints the filename, followed by the line number in
  1188.           brackets, followed by the error or debugging message.  If the
  1189.           verbose flag (-v) is supplied, it echoes the line from the file as
  1190.           well.
  1191.  
  1192.  
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.           REMIND 2.3.0   (19 February 1991)                          Page 19
  1199.  
  1200.  
  1201.  
  1202.  
  1203.  
  1204.           6. WISH LIST
  1205.  
  1206.           o    REMIND has been ported to Unix.  The source has been posted
  1207.                on alt.sources and comp.sources.misc on the usenet.  It's
  1208.                also available in the file pub/remind-2.3.0.tar.Z via
  1209.                anonymous ftp from alfred.ccs.carleton.ca (134.117.1.1)
  1210.  
  1211.           o    Faster algorithms for date calculation.  Most of the
  1212.                algorithms are fairly "brute force", but they execute
  1213.                reasonably quickly.  The "back" feature especially leads to a
  1214.                lot of backtracking.
  1215.  
  1216.           o    A prettier interface - maybe some snazzy pop-up windows, with
  1217.                centered messages, colors and so on... well, if you really
  1218.                want that, use REMIND as a back-end and do some post-
  1219.                processing on its output.  Easy from Unix, slow from MS-DOS.
  1220.  
  1221.           o    Automatic purging of reminder files.  Could be useful or
  1222.                dangerous, depending on your perspective.
  1223.  
  1224.           7. WISHES LIST
  1225.  
  1226.           I hope you enjoy using REMIND.  If you have any suggestions,
  1227.           comments, bugs, problems, donations :-) or kudos, send them to:
  1228.  
  1229.           David Skoll
  1230.           4-317 Lebreton Street
  1231.           Ottawa, Ontario
  1232.           K1S 4L4  CANADA
  1233.           Tel. (613) 567-3662
  1234.  
  1235.           I can be reached by e-mail at dfs@doe.carleton.ca.
  1236.  
  1237.  
  1238.  
  1239.  
  1240.  
  1241.  
  1242.  
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.           REMIND 2.3.0   (19 February 1991)                          Page 20
  1258.